记录一次前端项目和 deno 共享 schema 类型为 any 的问题

我前端项目主要依赖 vite + typescript + zod。为了 schema 一致性,我在前端直接引用了 Deno 项目下的 schema 定义(Deno 侧也使用相同版本的 zod)。

最初一切正常,但一次目录结构调整后,编辑器里跨目录引入的类型几乎都失效,表现为大量 any / 类型提示消失。

#原因排查

通过 tsc –traceResolution 找到具体原因

pnpm -C desktop exec tsc --noEmit -p tsconfig.app.json --traceResolution

关键日志大概如下:

Resolving module '~runner-schemas/tasks' ...

Module name '~runner-schemas/tasks' was successfully resolved to '.../runner/src/schemas/tasks/index.ts'

Resolving module 'zod' from '.../runner/src/schemas/tasks/task-event.ts' ...

Module name 'zod' was not resolved

这个证据说明:

  1. ~runner-schemas/tasks 别名本身解析成功了。
  2. 继续解析该文件依赖时,zod 失败,后续类型链被抑制,所以业务侧看到的是 any

#为什么目录调整后会触发

最初目录:

.
├── node_modules
├── src
├── src-deno
├── tsconfig.json

调整后目录:

.
├── desktop
│ ├── node_modules
│ ├── src
│ └── tsconfig.app.json
└── src-deno

这里 src-deno 相对于 desktopparent-sibling(不是 sibling)。

TypeScript 在解析 src-deno 文件里的 import 'zod' 时,不会自然命中 desktop/node_modules,于是 zod 类型解析失败。

#修复方式

在前端 tsconfigpaths 里同时配置:

  1. schema 路径别名
  2. zod 到前端 node_modules 的显式映射
{
    "compilerOptions": {
    "paths": {
        "~runner-schemas/*": ["../src-deno/schemas/*"],
        "zod": ["./node_modules/zod"],
        "zod/*": ["./node_modules/zod/*"]
        }
    }
}
593 Words